package com.loong.android.tools;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.widget.ImageView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.bumptech.glide.Glide;
import com.bumptech.glide.RequestBuilder;
import com.bumptech.glide.load.MultiTransformation;
import com.bumptech.glide.load.Transformation;
import com.bumptech.glide.load.resource.bitmap.CircleCrop;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.SimpleTarget;
import com.bumptech.glide.request.transition.Transition;

import java.util.ArrayList;
import java.util.List;

import jp.wasabeef.glide.transformations.BlurTransformation;
import jp.wasabeef.glide.transformations.ColorFilterTransformation;
import jp.wasabeef.glide.transformations.CropSquareTransformation;
import jp.wasabeef.glide.transformations.GrayscaleTransformation;

/**
 * 图片加载器，用于将本地或网络图片加载到图片框中
 */
public class ImgLoader {

    private static ImgLoader instance;

    private RequestOptions options = null;
    private List<Transformation> transformations = new ArrayList<>();

    /**
     * 取单例
     */
    public static ImgLoader getInstance() {
        if(instance == null) instance = new ImgLoader();
        return instance;
    }

    private <T> RequestBuilder<T> apply(RequestBuilder<T> glide) {
        if(transformations != null && transformations.size() > 0) {
            if(options == null) options = new RequestOptions();
            options = options.transform(new MultiTransformation(transformations));
        }
        if(options != null) glide = glide.apply(options);
        return glide;
    }

    /**
     * 加载图片到图片框中
     * @param imageView 图片框
     */
    private void into(RequestBuilder<Drawable> glide, ImageView imageView) {
        glide = apply(glide);
        glide.into(imageView);
    }

    /**
     * 通过图片资源id的方式载入图片
     * @param context 上下文
     * @param resId 图片资源id
     * @param imageView 图片框
     */
    public ImgLoader load(Context context, int resId, ImageView imageView) {
        into(Glide.with(context).load(resId), imageView);
        return this;
    }

    /**
     * 通过图片位图数据的方式载入图片
     * @param context 上下文
     * @param bitmap 图片位图数据
     */
    public ImgLoader load(Context context, Bitmap bitmap, ImageView imageView) {
        into(Glide.with(context).load(bitmap), imageView);
        return this;
    }

    /**
     * 通过图片文件路径的方式载入图片，注意需要先获得读取文件的权限
     * @param context 上下文
     * @param filePath 图片路径
     */
    public ImgLoader load(Context context, String filePath, ImageView imageView) {
        into(Glide.with(context).load(filePath), imageView);
        return this;
    }

    /**
     * 通过图片字节数组的方式载入图片，注意需要先获得读取文件的权限
     * @param context 上下文
     * @param bytes 图片字节数组
     */
    public ImgLoader load(Context context, byte[] bytes, ImageView imageView) {
        into(Glide.with(context).load(bytes), imageView);
        return this;
    }

    /**
     * 将图片数据载入到图片框中
     * @param context 上下文
     * @param imgSource 图片数据
     */
    public ImgLoader load(Context context, Object imgSource, ImageView imageView) {
        into(Glide.with(context).load(imgSource), imageView);
        return this;
    }

    /**
     * 下载图片
     * @param context 上下文
     * @param url 图片url
     * @param event 下载回调
     */
    public ImgLoader download(Context context, String url, DownloadEvent event) {
        into(Glide.with(context).asBitmap().load(url), event);
        return this;
    }

    /**
     * 设置图片加载过程中显示的占位图
     * @param resId 图片资源id
     */
    public ImgLoader loadingImg(int resId) {
        if(options == null) options = new RequestOptions();
        options = options.placeholder(resId);
        return this;
    }

    /**
     * 设置图片加载错误时显示的占位图
     * @param resId 图片资源id
     */
    public ImgLoader errorImg(int resId) {
        if(options == null) options = new RequestOptions();
        options = options.error(resId);
        return this;
    }

    /**
     * 添加圆形处理
     */
    public ImgLoader circle() {
        transformations.add(new CircleCrop());
        return this;
    }

    /**
     * 添加方形处理
     */
    public ImgLoader square() {
        transformations.add(new CropSquareTransformation());
        return this;
    }

    /**
     * 添加圆角处理
     * @param size 圆角大小
     */
    public ImgLoader corner(int size) {
        transformations.add(new RoundedCorners(size));
        return this;
    }

    /**
     * 添加颜色滤镜
     * @param color 颜色值
     */
    public ImgLoader colorFilter(int color) {
        transformations.add(new ColorFilterTransformation(color));
        return this;
    }

    /**
     * 添加灰度处理
     */
    public ImgLoader grayScale() {
        transformations.add(new GrayscaleTransformation());
        return this;
    }

    /**
     * 添加模糊处理
     */
    public ImgLoader blur() {
        transformations.add(new BlurTransformation());
        return this;
    }

    /**
     * 添加模糊处理
     * @param radius 半径
     */
    public ImgLoader blur(int radius) {
        transformations.add(new BlurTransformation(radius));
        return this;
    }

    /**
     * 添加模糊处理
     * @param radius 半径
     * @param sampling 采样
     */
    public ImgLoader blur(int radius, int sampling) {
        transformations.add(new BlurTransformation(radius, sampling));
        return this;
    }

    /**
     * 清除图片处理效果
     */
    public ImgLoader clear() {
        transformations.clear();
        return this;
    }

    /**
     * 加载图片
     * @param event 回调事件
     */
    private void into(RequestBuilder<Bitmap> glide, DownloadEvent event) {
        glide = apply(glide);
        glide.into(new SimpleTarget<Bitmap>() {
            @Override
            public void onStart() {
                super.onStart();
                if(event != null) event.onStart();
            }

            @Override
            public void onStop() {
                super.onStop();
                if(event != null) event.onStop();
            }

            @Override
            public void onDestroy() {
                super.onDestroy();
                if(event != null) event.onDestroy();
            }

            @Override
            public void onLoadFailed(@Nullable Drawable errorDrawable) {
                super.onLoadFailed(errorDrawable);
                if(event != null) event.onFail();
            }

            @Override
            public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition transition) {
                if(event != null) event.onComplete(resource);
            }
        });
    }

    /**
     * 清除图片缓存
     * @param context 上下文
     */
    public static void clearMemory(Context context) {
        Glide.get(context).clearMemory();
    }

    /**
     * 清除磁盘缓存
     * @param context 上下文
     */
    public static void clearDiskCache(Context context) {
        Glide.get(context).clearDiskCache();;
    }


    /**
     * 图片下载的接口事件
     */
    public abstract static class DownloadEvent {
        /**
         * 开始下载
         */
        public void onStart() {

        }

        /**
         * 停止下载
         */
        public void onStop() {

        }

        /**
         * 被销毁
         */
        public void onDestroy() {

        }

        /**
         * 下载失败
         */
        public void onFail() {

        }

        /**
         * 图片下载完毕事件
         * @param bitmap 图片位图数据
         */
        public void onComplete(Bitmap bitmap) {

        }
    }
}
